package com.itheima.reggie.Controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.Pojo.User;
import com.itheima.reggie.Service.UserService;
import com.itheima.reggie.Untils.SMSUtils;
import com.itheima.reggie.Untils.ValidateCodeUtils;
import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
//  将验证码存进Redis缓存中
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
//      获取手机号
        String phone = user.getPhone();
        if(phone!=null){
//      生成验证码
        String code = ValidateCodeUtils.generateValidateCode(6).toString();
        log.info("code={}",code);
//      调用阿里云提供的短信服务API完成发送短信
//      参数一：短信签名 参数二：模板code 参数三：手机号 参数四：动态验证码
        SMSUtils.sendMessage("阿里云短信测试","SMS_154950909",phone,code);
//      将生成的验证码存储到Session中,以手机号为key,验证码为value

//        session.setAttribute(phone,code);
        redisTemplate.opsForValue().set(phone,code,5L, TimeUnit.MINUTES);
        return R.success("手机验证码发送成功");
        }

        return R.error("手机验证码发送失败");

    }

    @PostMapping("/login")
    public R<User> login(@RequestBody Map map,HttpSession session){
        log.info("map:{}",map);
        String code = (String) map.get("code");
        String phone = (String) map.get("phone");
//      判断验证码是否正确
//        if(session.getAttribute(phone).equals(code)){
//        从缓存中获取数据
          if(redisTemplate.opsForValue().get(phone).equals(code)){
//          通过手机号从数据库获取用户信息
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getPhone,phone);
            User user = userService.getOne(queryWrapper);
//          判断该手机号是否注册过
            if(user==null){
//              若为新用户，则自动注册一个用户
                user = new User();
                user.setPhone(phone);
                user.setStatus(1);
                userService.save(user);
            }
//          登录成功之后需要把用户的id存到session里面，否则会被过滤器器拦截
            session.setAttribute("user",user.getId());
//          删除缓存中的数据
            redisTemplate.delete(phone);
           return R.success(user);
        }
        return R.error("验证码输入错误");
    }

}
